/*
 * AbstractQueue.java
 * Autor: Jennifer Pamela Valdez Cabrera
 * Carne: 10189
 * Fecha de entrega: 3 de septiembre de 2011
 * Descripcion: Es la clase abtracta de la cola que contiene los atributos y métodos que se utilizarán en 
 * 		cualquier implementación.
*/

public abstract class AbstractQueue<E> implements Queue<E>{

    // atributos de la clase abstracta
    protected int cont;
    protected int numElements;
    
    // constructor de la clase abstacta 
    public AbstractQueue(){}
	//post: no hace nada
    
    /* 
      ---------------------------------------------------------------------
      add: agrega un elemento a la cola, el cual es recibido como
              parametro y no devuelve ningun valor.
      ---------------------------------------------------------------------
    */ 
    public abstract void add(E value);
    // post: el valor es agregado al final de la cola

     /* 
        ---------------------------------------------------------------------
        size: indica cuantos elementos posee la cola
        ---------------------------------------------------------------------
    */ 
    
    public int size() {
        return cont;
    }
    // post: devuelve el numero de elementos en la cola

    /* 
        ---------------------------------------------------------------------
        isEmpty: indica si la cola esta vacia
        ---------------------------------------------------------------------
    */ 
    public boolean isEmpty() {
       return (cont==0);
    }
    // post: devuelve verdadero si la cola esta vacia

    /* 
        ---------------------------------------------------------------------
        isFull: indica si la cola esta llena
        ---------------------------------------------------------------------
    */ 
    public boolean isFull() {
       return (cont==numElements);
    }
    // post: devuelve verdadero si la cola esta llena
    
    /* 
        ---------------------------------------------------------------------
        remove: obtiene el elemento al cual le toca salir y lo remueve de la
                cola si no esta vacio; dicho elemento es devuelto
        ---------------------------------------------------------------------
    */ 
    public abstract E remove();
    // pre: la cola no esta vacia
    // post: devuelve y remueve el primer elemento de la cola

    /* 
        ---------------------------------------------------------------------
        peek: devuelve el elemento proximo a ser removido
        ---------------------------------------------------------------------
    */ 
    public abstract E peek();
    // pre: la cola no esta vacia
    // post: devuelve el primer elemento de la cola 
}
